package leetcode.binarysearch;

/**
 * 
 * @author 26233
 *
 *
 *实现 int sqrt(int x) 函数。

计算并返回 x 的平方根，其中 x 是非负整数。

由于返回类型是整数，结果只保留整数的部分，小数部分将被舍去。

示例 1:

输入: 4
输出: 2
示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数，小数部分将被舍去。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode69_MySqrt {
	

	public static int mySqrt(int x) {

		if(x == 1)return 1;
		int p = 0, q = x / 2 + 1;
		while(p < q) {
			if(p + 1 == q)break;// x不是平方数，跳出循环
			int temp = (p + q) / 2;
			if(temp * temp == x) return temp;// x是平方数
			if((long)temp * temp  > x) {// 折半，考虑int溢出使用long。也可考虑使用除法的方式即y/a == a，避免乘法溢出，但考虑a=0
				q = temp;
			}else {
				p = temp;
			}
		}
		
		return p;
    }
	
	public static void main(String[] args) {
		System.out.println(mySqrt(2147395599));
		System.out.println((long)1073697799 * 1073697799);
	}

}
